package pe.com.astech.web.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.NestedRuntimeException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import pe.com.astech.web.bean.EmpleadoBean;
import pe.com.astech.web.bean.ExperienciaBean;
import pe.com.astech.web.bean.MensajeBean;
import pe.com.astech.web.bean.PerfilBean;
import pe.com.astech.web.bean.UrlBean;
import pe.com.astech.web.bean.UsuarioBean;
import pe.com.astech.web.exception.DBException;
import pe.com.astech.web.service.EmpleadoService;
import pe.com.astech.web.util.Constantes;

@Controller
@RequestMapping(value = "/operario.html")
public class OperarioController {

	@Autowired
	EmpleadoService empleadoService;
	
	private static final Log log = LogFactory.getLog(OperarioController.class);
	
	@RequestMapping(method = RequestMethod.GET)
	public String showForm(ModelMap model) {
		String mensajeTrazabilidad = "metodo: showForm operario";
		log.info(mensajeTrazabilidad);
		List<EmpleadoBean> listOperario = null;
		try {
			listOperario = empleadoService.buscarEmpleado(mensajeTrazabilidad, Constantes.VACIO,Constantes.PERFIL_OPERARIO);
		} catch (NestedRuntimeException e) {
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		
		model.put("operarioListOperario", listOperario);
		model.put("respuesta", "");
		
		return Constantes.FORM_OPERARIO;
	}
	
	@RequestMapping(params={"accion=buscarOperario","nombre"})
	public String buscarOperario(ModelMap model,@RequestParam("nombre") String nombre) {
		
		String mensajeTrazabilidad = "metodo: buscarOperario ";
		log.info(mensajeTrazabilidad + " nombre = " + nombre);
				
		List<EmpleadoBean> listOperario = new ArrayList<EmpleadoBean>();
		try {
			listOperario = empleadoService.buscarEmpleado(mensajeTrazabilidad, nombre,Constantes.PERFIL_OPERARIO);
		} catch (NestedRuntimeException e) {
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		
		model.put("operarioListOperario", listOperario);
		
		return Constantes.FORM_OPERARIO;
	}
	
	@RequestMapping(params={"accion=modificarOperario","id_empleado"})
	public String modificarOperario(ModelMap model,@RequestParam("id_empleado") String id_empleado,HttpServletRequest request) {
		
		String mensajeTrazabilidad = "metodo: modificaOperario ";
		log.info(mensajeTrazabilidad + " id_empleado = " + id_empleado);
		
		EmpleadoBean empleadoBean = new EmpleadoBean();
		try {
			empleadoBean = empleadoService.obtenerEmpleadoYExp(mensajeTrazabilidad, id_empleado,Constantes.PERFIL_OPERARIO);
		} catch (NestedRuntimeException e) {
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		
		request.getSession(false).setAttribute("empleadoListExperiencia", empleadoBean.getListExperiencia());
		model.put("empleadoBean", empleadoBean);
		model.put("empleadoListExperiencia", empleadoBean.getListExperiencia());
		
		return Constantes.FORM_MODIFICAR_OPERARIO;
	}
	
	@RequestMapping(params={"accion=actualizarExpOperario","id_empleado"})
	public String actualizarExpOperario(ModelMap model,@RequestParam("id_empleado") String id_empleado,HttpServletRequest request) {
		
		String mensajeTrazabilidad = "metodo: modificaOperario ";
		log.info(mensajeTrazabilidad + " id_empleado = " + id_empleado);
		
		EmpleadoBean empleadoBean = new EmpleadoBean();
		try {
			empleadoBean = empleadoService.obtenerEmpleadoYExp(mensajeTrazabilidad, id_empleado,Constantes.PERFIL_OPERARIO);
		} catch (NestedRuntimeException e) {
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		
		request.getSession(false).setAttribute("empleadoListExperiencia", empleadoBean.getListExperiencia());
		model.put("empleadoBean", empleadoBean);
		model.put("empleadoListExperiencia", empleadoBean.getListExperiencia());
		
		return Constantes.FORM_MODIFICAR_OPERARIO;
	}
	
	
	
	@RequestMapping(params={"accion=buscarExperienciasOperario"},method = RequestMethod.GET)
	public String buscarExperienciasOperario(ModelMap model,HttpServletRequest request){
		
		String mensajeTrazabilidad = "metodo: buscarExperienciasOperario";
		log.info(mensajeTrazabilidad);
		List<ExperienciaBean> empleadoListExperiencia = (List<ExperienciaBean>) request.getSession(false).getAttribute("empleadoListExperiencia");
		log.info(mensajeTrazabilidad + " cantidad experiencia : " + empleadoListExperiencia.size());
		
		model.put("empleadoListExperiencia", empleadoListExperiencia);
		
		return Constantes.FORM_MODIFICAR_OPERARIO;
	}
	
	
	@RequestMapping(params={"accion=eliminarExperienciaOperario","id_empleado","id_herramienta"},method = RequestMethod.GET)
	public String eliminarExperienciaOperario(ModelMap model,HttpServletRequest request,@RequestParam("id_empleado") String id_empleado
			,@RequestParam("id_herramienta") String id_herramienta){
		
		String mensajeTrazabilidad = "metodo: eliminarExperienciaOperario";
		log.info(mensajeTrazabilidad + " id_empleado: " + id_empleado);
		log.info(mensajeTrazabilidad + " id_herramienta: " + id_herramienta);
		
		List<ExperienciaBean> empleadoListExperiencia = (List<ExperienciaBean>) request.getSession(false).getAttribute("empleadoListExperiencia");
		log.info(mensajeTrazabilidad + " cantidad experiencia : " + empleadoListExperiencia.size());
		
		List<ExperienciaBean> clonEmpleadoListExperiencia = empleadoService.listaEliminarExpEmpleado(mensajeTrazabilidad,empleadoListExperiencia,id_empleado,id_herramienta);
		
		empleadoListExperiencia.removeAll(clonEmpleadoListExperiencia);
		
		model.put("empleadoListExperiencia", empleadoListExperiencia);
		request.getSession(false).setAttribute("empleadoListExperiencia", empleadoListExperiencia);
		request.getSession(false).setAttribute("removeEmpleadoListExperiencia", clonEmpleadoListExperiencia);
		
		return Constantes.FORM_MODIFICAR_OPERARIO;
	}
	
	
	@RequestMapping(params={"accion=guardarExpOperario"},method = RequestMethod.POST)
	public String guardarExpOperario(ModelMap model,HttpServletRequest request,@Valid EmpleadoBean empleadoBean,BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: guardarExpOperario ";
		log.info(mensajeTrazabilidad + "  " + empleadoBean.toString());
		List<ExperienciaBean> empleadoListExperiencia = (List<ExperienciaBean>) request.getSession(false).getAttribute("empleadoListExperiencia");
		List<ExperienciaBean> removeEmpleadoListExperiencia = (List<ExperienciaBean>) request.getSession(false).getAttribute("removeEmpleadoListExperiencia");
		String respuesta = Constantes.OK;
			
		List<EmpleadoBean> listOperario = null;
		try {
			listOperario = empleadoService.guardarExpEmpleado(mensajeTrazabilidad,empleadoBean,empleadoListExperiencia,removeEmpleadoListExperiencia);
		} catch (RuntimeException e) {
			respuesta = Constantes.NOOK;
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		model.put("operarioListOperario", listOperario);
		model.put("respuesta", respuesta);
		
		return Constantes.FORM_OPERARIO;
	}
	
	@RequestMapping(params={"accion=redireccionarExp"},method = RequestMethod.POST)
	public ModelAndView redireccionarExp(ModelMap model,HttpServletRequest request,@Valid EmpleadoBean empleadoBean,BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: redireccionarExp ";
		log.info(mensajeTrazabilidad + "  " + empleadoBean.toString());
		
		return new ModelAndView("redirect:/experiencia.html?accion=nuevaExperienciaOperario&id_empleado="+empleadoBean.getId_empleado());
	}
	
	@RequestMapping(params={"accion=redireccionarExpModif"},method = RequestMethod.POST)
	public ModelAndView redireccionarExpModif(ModelMap model,HttpServletRequest request,@Valid EmpleadoBean empleadoBean,BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: redireccionarExp ";
		log.info(mensajeTrazabilidad + "  " + empleadoBean.toString());
		
		return new ModelAndView("redirect:/experiencia.html?accion=modificarExperienciaOperario&id_empleado="+empleadoBean.getId_empleado()+"&id_herramienta="+empleadoBean.getId_herramienta());
	}
	
	@RequestMapping(params={"accion=cargarOperario","id_empleado","respuestaExp"})
	public String cargarOperario(ModelMap model,@RequestParam("id_empleado") String id_empleado,@RequestParam("respuestaExp") String respuestaExp,HttpServletRequest request) {
		
		String mensajeTrazabilidad = "metodo: modificaOperario ";
		log.info(mensajeTrazabilidad + " id_empleado = " + id_empleado);
		log.info(mensajeTrazabilidad + " respuestaExp = " + respuestaExp);
		List<ExperienciaBean> empleadoListExperiencia = null;
		
		EmpleadoBean empleadoBean = new EmpleadoBean();
		try {
			empleadoBean = empleadoService.obtenerEmpleadoYExp(mensajeTrazabilidad, id_empleado,Constantes.PERFIL_OPERARIO);
			empleadoListExperiencia = (List<ExperienciaBean>) request.getSession(false).getAttribute("empleadoListExperiencia");
		} catch (NestedRuntimeException e) {
			log.error(mensajeTrazabilidad + " ERROR = " + e.getMessage());
		}
		
		request.getSession(false).setAttribute("empleadoListExperiencia", empleadoListExperiencia);
		model.put("empleadoBean", empleadoBean);
		model.put("empleadoListExperiencia", empleadoListExperiencia);
		model.put("respuestaExp", respuestaExp);
		
		return Constantes.FORM_MODIFICAR_OPERARIO;
	}
	
}
